﻿// ## 2023/05/30 # 江东新风 # 攻占后计算过慢，改为原算法 ##
// ## 2023/05/17 # 江东新风 # 解决短期多次攻占，人口锐减问题 ##
// ## 2023/03/09 # 铃 # 发生两次攻破后会出现人口锐减且无法回归的问题,要改的话太麻烦了.累加的话又会导致人口波动特别大,先取消掉后面再想办法 ##
// ## 2023/03/09 # 铃 # 攻破城市时重置所有的内政官.
// ## 2021/10/29 # 江东新风 # 结构体存储调用方式改进 ##
// ## 2021/10/28 # 江东新风 # 单港关存活设定变更 ##
// ## 2021/10/10 # 江东新风 # 据点攻占后的人口增减 ##
// ## 2021/10/01 # 江东新风 # namespace的韩文改成英文 ##
// ## 2021/02/18 # 江东新风 # 调整吸收比例为魅力相关，最大20% ##
// ## 2021/02/18 # 江东新风 # 尝试修复单港关bug ##
// ## 2021/02/08 # 江东新风 # 单港关时，势力灭亡条件的修正，城市被占领后留有港关也可存活 ##
// ## 2021/01/24 # 江东新风 # 关闭单城市灭亡 ##
// ## 2021/01/14 # 江东新风 # 关掉trace ##
// ## 2021/01/05 # 江东新风 # 特殊地名设施争夺的完善2 ##
// ## 2020/12/26 # 江东新风 # 关掉trace ##
// ## 2020/12/25 # 江东新风 # 据点灭亡修正 ##
// ## 2020/12/23 # 江东新风 # 加入据点灭亡开关 ##
// ## 2020/12/17 # 江东新风 # 实验添加据点为势力最后据点时，势力灭亡，配合港口势力不灭亡的设定 ##
// ## 2020/08/14 # 江东新风 # 新特技-安民 ##
// ## 2020/08/05 # messi # 調低?領据点获取物資的参数 ##
// ## 2020/08/01 ##
namespace KANRAKU
{
	const bool 原版资源吸收 = false;

	/// [ 거점 점령 후처리 : 거점자원 ]

		/// 资源吸收比例 모드
		// 모드 1 : 吸收比例 魅力反应 (PK2.1 원본과 동일모드)
		// 모드 2 : 吸收比例 直接设定 (에볼루션킷 원본과 동일모드)
	const array<int>
		资源吸收比例_模式 = {/*玩家*/1, /*电脑*/1 },

		/// 모드 1 : 吸收比例 魅力反应
		// 기본값 설명 : 매력이 80인 경우 80의 10%가 8이므로 전체 거점자원의 8%를 흡수 (吸收比例 최소 5%, 최대 100%)
		资源吸收比例_魅力反应比例 = {/*玩家*/12, /*电脑*/12 },
		资源吸收比例_最大吸收比例 = {/*玩家*/20, /*电脑*/20 },
		资源吸收比例_最小吸收比例 = {/*玩家*/5, /*电脑*/5 },

		/// 모드 2 : 吸收比例 直接设定
		// 기본값 설명 : 거점의 모든 자원에 대하여 자원별로 70%를 흡수
		资源吸收比例_金 = {/*玩家*/30, /*电脑*/30 },
		资源吸收比例_兵粮 = {/*玩家*/30, /*电脑*/30 },
		资源吸收比例_兵力 = {/*玩家*/30, /*电脑*/30 },
		资源吸收比例_兵器 = {/*玩家*/30, /*电脑*/30 };

	class Main
	{
		Main()
		{
			pk::set_func(168, pk::func168_t(callback));
			pk::bind(131, pk::trigger131_t(onForceRemove));
		}

		void onForceRemove(pk::force@ force, bool merge, pk::force@ by)
		{
			for (int i = 0; i < ch::get_spec_end(); i++)
			{
				pk::point pos0 = ch::get_spec_pos(i);
				pk::hex @hex = pk::get_hex(pos0);

				pk::building @spec = pk::get_building(pos0);
				if (pk::is_alive(spec) and spec.get_force_id() == force.get_id())
				{
					spec.init_force = -1;
					ch::reset_spec(i);
				}
				// pk::set_district(pk::get_building(pk::get_building_id(pos0)), pk::get_district(pk::get_district_id(force, 0)), /*占领*/0);
			}
		}


		void callback(pk::building@ base, pk::unit@ attacker)
		{
			pk::person@ leader;

			if (pk::is_alive(attacker))
				@leader = pk::get_person(attacker.leader);

			int n = 5;
			int charisma = 20;

			if (pk::is_alive(leader))
			{
				charisma = leader.stat[武将能力_魅力];
				n = pk::max(charisma / 10, 5);
			}
			// pk::trace("资源吸收 pos0");
			if (原版资源吸收)
			{
				// pk::trace("资源吸收 pos1.1");
				pk::set_gold(base, pk::get_gold(base) * n / 100);
				pk::set_food(base, pk::get_food(base) * n / 100);
				pk::set_troops(base, pk::get_troops(base) * n / 100);
				for (int i = 0; i < 兵器_末; i++)
					pk::set_weapon_amount(base, i, pk::get_weapon_amount(base, i) * n / 100);
			}
			else func_占领城市后处理_资源(base, attacker, charisma);

			//破城后重置所有的内政官
			auto building_p = ch::get_baseIA(base.get_id());
			building_p.init();//
			内政自动::calculate_building2(pk::get_building(base.get_id()), false);

			//破城后重置兵役政策为2
			building_p.building_policy = 2;

			auto base_t = ch::get_base_p(base.get_id());
			func_人口处理(base, attacker, base_t, charisma);

			// if (开启小兵拔擢)
			// {
			// 	if (pk::rand_bool(50)) batt::generate_talent_seed(leader);
			// }

			// pk::city@ city = pk::building_to_city(base);

			// //如果不是城市的话，就到此为止 도시가 아닌경우 여기서 종료
			// if (!pk::is_alive(city))
			// 	return;

			int base_id = base.get_id();
			int base_force_id = base.get_force_id();
			pk::list<pk::building@> city_devs;
			pk::list<pk::building@> buildings = pk::get_building_list();
			int building_id = -1;
			int spec_id = -1;
			for (int i = 0; i < buildings.size; i++)
			{
				pk::building@ building = buildings[i];
				if (pk::is_alive(building) and pk::get_building_id(building.get_pos()) == base_id)
				{
					//pk::trace(pk::format("建筑ID：{},base_id：{},建筑所在据点:{},", building.get_id(), base_id, pk::get_building_id(building.get_pos())));
					if (pk::get_facility_type(building) == 设施类型_内政设施 and base_id < 城市_末)
					{

						if (building.completed)
						{
							//已建成的内政设施如果不是铜雀台，将被随意破坏。 건설 완료된 내정시설은 동작대가 아니라면 무작위로 파괴.
							if (building.facility != 设施_铜雀台)//铜雀台
								city_devs.push_back(building);
						}
						else
						{
							//如果正在建设中的铜雀台受到破坏，铜雀宝物也将消失 건설중인 동작대가 파괴된 경우 동작 보물도 사라짐.
							if (building.facility == 设施_铜雀台)
							{
								pk::item@ item = pk::get_item(宝物_铜雀);
								if (pk::is_alive(item))
									pk::kill(item);
							}
							//正在建设中的内政设施全部遭到破坏。 건설중인 내정시설은 모두 파괴.
							else
							{
								pk::kill(building, false);
							}
						}
					}

					if (pk::get_facility_type(building) == 设施类型_军事设施)
					{
						building_id = building.get_id();
						spec_id = ch::to_spec_id(building_id);
						//处理地名设施
						if (ch::is_valid_spec_id(spec_id))
						{
							if (特定地点特定设施可争夺)
							{
								if (base_force_id == building.get_force_id() and attacker.get_force_id() != building.get_force_id())//只处理与被攻占城市相同势力的地名设施
								//if (base_force_id == building.get_force_id() and attacker.get_force_id() != building.get_force_id())//只处理与被攻占城市相同势力的地名设施
								{
									//pk::trace(pk::format("ID：{},ch::get_spec_end()：{},ch::get_normal_spec_end(){},", i, ch::get_spec_end(), ch::get_normal_spec_end()));
									if (spec_id >= ch::get_normal_spec_end())
									{
										auto spec_t = ch::get_spec_p(spec_id);
										building.init_force = 势力_盗贼;
										if (spec_id == ch::get_spec_end() - 1)
											spec_t.person = 798;
										else  spec_t.person = 799;
										spec_t.set_gold(1000);
										spec_t.set_food(50000);
										spec_t.set_troops(30000);
										auto spec_building = pk::get_building(spec_id + 100);
										spec_building.hp = 8000;

										pk::history_log(building.pos, -1, pk::encode(pk::format("\x1b[1x{}\x1b[24x的本地土著独立了!", ch::get_spec_name(spec_id))));
									}
									else {
														//pk::trace(pk::format("建筑ID：{},base_id：{},建筑所在据点:{},", building.get_id(), base_id, pk::get_building_id(building.get_pos())));
										building.init_force = attacker.get_force_id();
										ch::reset_spec(spec_id);
									}

								}
							}
						}
						else
						{
							//占领区域内城市所属势力以及其他势力的军事设施都将遭到破坏 구역 내 도시를 점령하고 있던 세력과 같은 세력의 군사시설은 모두 파괴
							if (pk::is_valid_force_id(base_force_id) and base_force_id == building.get_force_id())
								pk::kill(building, false);
						}
					}
				}
			}


			if (!ch::has_skill(attacker, 特技_安民))
			{
				n = city_devs.size;
				if (pk::is_valid_normal_force_id(attacker.get_force_id()))
					n = n - pk::min(charisma / 20, n);

				city_devs.shuffle();
				for (int i = 0; i < n; i++)
					pk::kill(city_devs[i], false);
			}


		}

		int get_index(pk::unit@ unit) { return (unit.is_player() ? /*玩家*/0 : /*电脑*/1); }

		/// 초기설정 : 일반세력 공격부대가 일반세력의 거점을 점령한 경우 기본적으로 거점의 자원(금, 병량, 병력, 병기)을 모두 흡수함 (설정 가능)
		// 일반세력 공격부대가 빈거점을 점령하는 경우는 해당사항 없음
		// 적장세력 공격부대가 일반세력의 거점을 점령하는 경우는 거점의 모든 자원이 손실됨
		void func_占领城市后处理_资源(pk::building@ base, pk::unit@ attacker, int charisma)
		{
			// pk::trace("资源吸收 pos2");
			int gold_ratio = 0, food_ratio = 0, troops_ratio = 0, wpn_amount_ratio = 0;

			if (资源吸收比例_模式[get_index(attacker)] == /*吸收比例 魅力反应*/1)
			{
				int charisma_ratio = 资源吸收比例_魅力反应比例[get_index(attacker)];
				int min_ratio = 资源吸收比例_最小吸收比例[get_index(attacker)];
				int max_ratio = 资源吸收比例_最大吸收比例[get_index(attacker)];
				int resource_ratio = pk::min(max_ratio, pk::max((charisma * charisma_ratio / 100), min_ratio));
				gold_ratio = food_ratio = troops_ratio = wpn_amount_ratio = resource_ratio;
			}
			else if (资源吸收比例_模式[get_index(attacker)] == /*吸收比例 直接设定*/2)
			{
				gold_ratio = 资源吸收比例_金[get_index(attacker)];
				food_ratio = 资源吸收比例_兵粮[get_index(attacker)];
				troops_ratio = 资源吸收比例_兵力[get_index(attacker)];
				wpn_amount_ratio = 资源吸收比例_兵器[get_index(attacker)];
			}

			pk::set_gold(base, (pk::get_gold(base) * gold_ratio / 100));
			pk::set_food(base, (pk::get_food(base) * food_ratio / 100));
			pk::set_troops(base, (pk::get_troops(base) * troops_ratio / 100));
			for (int i = 0; i < 兵器_末; i++)
				pk::set_weapon_amount(base, i, (pk::get_weapon_amount(base, i) * wpn_amount_ratio / 100));
		}


		void func_人口处理(pk::building@ base, pk::unit@ attacker, BaseInfo@ base_t, int charisma)
		{
			if (开启人口系统)
			{
				int base_id = base.get_id();

				if (base_id > -1 and base_id < 据点_城市末 and !ch::has_skill(attacker, 特技_安民))
				{
					//auto base_t = ch::get_base_p(base_id);
					//考虑短期多次攻占影响，则应引入return_timer作为参数，此数字大，代表短期内曾被攻占，应减少人口损失
					float mutiple_capture_eff = (base_t.return_timer > 1 ? 0.7f : 1.0f);
					int reduce_population = pk::min(base_t.population - 5000, int(base_t.population * 0.3 * mutiple_capture_eff * (base.is_player() ? 1.0 : 0.5)));

					base_t.return_pop = uint32(pk::min(800000, base_t.return_pop + reduce_population));//返回人口的设定
					base_t.population = base_t.population - reduce_population;

					//添加据点被攻占后标志，达成条件后可产生人口恢复buf
					// 9回合城市建筑量达7个，触发buf，人口回归
					base_t.return_timer = 9;
					base_t.return_buf_timer = 0;

				}
				else if (base_id >= 据点_关卡开始 and base_id < 据点_据点末)
				{
					//auto base_t = ch::get_base_p(base_id);
				}

			}

		}
	}

	Main main;
}